I hate an official app, so I built my own

Jul 19, 2025 5 min

App Building Illustration

The Frustration: A New Office, a Flawed App

Moving to a new office always comes with its quirks, and for me, one of the biggest was the mandatory official app. This app was our gateway, quite literally, to the building. Every time we entered or exited, we had to pull out our phones, open the app, and display a QR code to pass through the gates. Sounds simple enough, right?

Unfortunately, the reality was far from seamless. The app had some glaring flaws that quickly became daily annoyances. It wasn’t user-friendly, often felt clunky, and, most critically, it didn’t work offline. Imagine standing at the gate, phone in hand, only to realize you have no signal, and suddenly, you’re stuck. To add to the woes, a crucial button was hard to reach, making quick access a constant struggle.

As a developer, I couldn’t help but wonder: could I build a better version? Could I tweak an app designed for a simple task to make it truly seamless and user-friendly? This thought sparked a personal project that would eventually become “mxiexie.”

The Deep Dive: Reverse Engineering and Discovery

My journey began with a bit of digital archaeology. I started by digging into the official app’s Android Package Kit (APK). My tool of choice for this was JADX, a fantastic decompiler that helped me peek under the hood.

What I found was quite insightful: the app was built with Cordova, essentially a web application wrapped in a native container, with its assets residing in a www folder. This discovery was a game-changer. It meant that the core logic and UI were likely based on web technologies, and more importantly, I could potentially reverse-engineer its API interactions. After some dedicated analysis, I managed to figure out how the app communicated with its backend, how it fetched access data, and how the QR codes were generated. This was the blueprint I needed.

The Build: Kotlin Multiplatform and AI Assistance

With a clear understanding of the official app’s mechanics, I set out to build my own. My weapon of choice for this endeavor was Kotlin Multiplatform (KMP). KMP was the perfect fit, allowing me to share business logic across both Android and iOS platforms, ensuring consistency and accelerating development.

Building the UI was a joy thanks to Jetpack Compose, Kotlin’s modern declarative UI toolkit. It made creating native Android and iOS interfaces from a single codebase incredibly efficient and enjoyable. I found myself in a state of “vibe coding,” where the development flow felt natural and intuitive.

During this process, I also experimented with cutting-edge tools. A significant portion of the codebase was developed with the assistance of Android Studio Agent Mode (still in canary at the time!) and Jules. Leveraging AI in this way truly accelerated development and helped improve code quality. For network requests, I opted for Ktor, a lightweight and asynchronous HTTP client for Kotlin, and for local data persistence, I used Datastore Preference Multiplatform.

The Result: A Better User Experience

The result of this journey is “mxiexie,” an alternative application designed to address all the pain points of the official app. It offers:

  • Offline functionality: No more getting stuck at the gate due to a lack of signal. Your QR codes are available even when you’re offline.

  • Optimized network fetching: Faster loading times and a smoother experience.

  • Persistent floor access: No need to re-select your access every time.

  • An improved user experience: I replaced the clunky dropdown selections with intuitive Group Chips, making navigation much more fluid.

My user data, including login credentials and access information, is stored locally on my device and is only sent to the official service for authentication and data retrieval. This application does not save or transmit my data to any other third-party servers, ensuring privacy and security.

Building “mxiexie” was more than just solving a personal inconvenience; it was a testament to how a little frustration can spark a rewarding development journey, leading to a truly improved user experience. If you’re curious, you can find the open source project on GitHub.

~Fajar Ulin Nuha